home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / mkmsgsrc.zip / MKSTRING.PAS < prev    next >
Pascal/Delphi Source File  |  1992-09-19  |  16KB  |  740 lines

  1. Unit mkstring;
  2. {$I MKB.Def}
  3.  
  4.  
  5. Interface
  6.  
  7. {$IFDEF WINDOWS}
  8. Uses WinDos;
  9. {$ELSE}
  10. Uses Dos;
  11. {$ENDIF}
  12.  
  13. Function LoCase(Ch: Char): Char;
  14. Function padright(st:string;ch:char;l:integer):string;
  15. Function PadLeft(St:String;Ch:Char;L:Integer): String;
  16. function striplead(st:string;ch:char):string;
  17. Function StripTrail(St:String;Ch:Char):String;
  18. Function StripBoth(St:String;Ch:Char):String;
  19. Function Upper(St:String):String;
  20. Function Lower(St:String):String;
  21. Function Proper(St:String):String;
  22. Function WWrap(St:String; Max:Byte):String;
  23. function ExtractWord(Str : String; N : Integer) : String;
  24. Function WordCount(Str : String) : Integer;
  25. Function CommaStr(Number: LongInt): String;
  26. Function Long2Str(Number: LongInt): String;
  27. Function Bin2Str(Number: Byte): String;
  28. Function Str2Bin(St: String): Byte;
  29. Function Str2Long(St: String): LongInt;
  30. Function HexLong(Number:LongInt): String;
  31. Function HexStr(Number: Word): String;
  32. Function HexByte(Number: Byte): String;
  33. Function DateStr(DosDate: LongInt): String;
  34. Function TimeStr(DosDate: LongInt): String;
  35. Procedure AddBackSlash(Var InPath: String);
  36. Function WithBackSlash(InPath: String): String;
  37. {$IFDEF WINDOWS}
  38. Function FormattedDate(DT: TDateTime; Mask: String): String;
  39. {$ELSE}
  40. Function FormattedDate(DT: DateTime; Mask: String): String;
  41. {$ENDIF}
  42. Function FormattedDosDate(DosDate: LongInt; Mask:String): String;
  43. Function DOWStr(Dow: Word): String;
  44. Function DOWShortStr(DOW: Word): String;
  45. Function ReformatDate(ODate: String; Mask: String): String;
  46. Function TimeStr2Word(TS: String): Word;
  47. Function Word2TimeStr(CTime: Word): String;
  48. Function MonthStr(MonthNo: Word): String;
  49. Function Az2Str(Var Str: String; MaxLen: Byte): String; {Convert asciiz to string}
  50. Procedure Str2Az(Str: String; MaxLen: Byte; Var AZStr); {Convert string to asciiz}
  51. Function MKDateToStr(MKD: String): String; {Convert YYMMDD to MM-DD-YY}
  52. Function StrToMKDate(Str: String): String; {Convert MM-DD-YY to YYMMDD}
  53. Function CleanChar(InChar: Char): Char;
  54. Function IsNumeric(Str: String): Boolean;
  55.  
  56.  
  57. Const
  58.   CommaChar: Char = ',';
  59.  
  60. Var
  61.   ExtraString: String;
  62.  
  63. Implementation
  64.  
  65.  
  66. Function LoCase(Ch: Char): Char;
  67.   Begin
  68.   If (Ch in ['A'..'Z']) Then
  69.     LoCase := Chr(Ord(Ch) + 32)
  70.   Else
  71.     LoCase := Ch;
  72.   End;
  73.  
  74.  
  75. Procedure AddBackSlash(Var InPath: String);
  76.   Begin
  77.   If Length(InPath) > 0 Then
  78.     Begin
  79.     If InPath[Length(InPath)] <> '\' Then
  80.       Begin
  81.       InPath[0] := Chr(Length(InPath) + 1);
  82.       InPath[Length(InPath)] := '\';
  83.       End;
  84.     End;
  85.   End;
  86.  
  87.  
  88. Function WithBackSlash(InPath: String): String;
  89.   Begin
  90.   AddBackSlash(InPath);
  91.   WithBackSlash := InPath;
  92.   End;
  93.  
  94.  
  95. Function Bin2Str(Number: Byte): String;
  96.   Var
  97.     Temp1: Byte;
  98.     Temp2: Byte;
  99.     i: Word;
  100.     TempStr: String[8];
  101.  
  102.   Begin
  103.   Temp1 := 0;
  104.   Temp2 := $80;
  105.   For i := 1 to 8 Do
  106.     Begin
  107.     If (Number and Temp2) <> 0 Then
  108.       TempStr[i] := '1'
  109.     Else
  110.       TempStr[i] := '0';
  111.     Temp2 := Temp2 shr 1;
  112.     End;
  113.   TempStr[0] := #8;
  114.   Bin2Str := TempStr;
  115.   End;
  116.  
  117.  
  118. Function Str2Bin(St: String): Byte;
  119.   Var
  120.     i: Word;
  121.     Temp1: Byte;
  122.     Temp2: Byte;
  123.  
  124.   Begin
  125.   St := StripBoth(St,' ');
  126.   St := PadLeft(St,'0',8);
  127.   Temp1 := 0;
  128.   Temp2 := $80;
  129.   For i := 1 to 8 Do
  130.     Begin
  131.     If St[i] = '1' Then
  132.       Inc(Temp1,Temp2);
  133.     Temp2 := Temp2 shr 1;
  134.     End;
  135.   Str2Bin := Temp1;
  136.   End;
  137.  
  138.  
  139. Function Str2Long(St: String): LongInt;
  140.   Var
  141.    i: Word;
  142.    Temp: LongInt;
  143.  
  144.   Begin
  145.   St := StripBoth(St,' ');
  146.   Val(St,Temp,i);
  147.   If i = 0 Then
  148.     Str2Long := Temp
  149.   Else
  150.     Str2Long := 0;
  151.   End;
  152.  
  153.  
  154. Function DateStr(DosDate: LongInt): String;
  155.   Var
  156. {$IFDEF WINDOWS}
  157.     DT:TDateTime;
  158. {$ELSE}
  159.     DT: DateTime;
  160. {$ENDIF}
  161.     OutStr: String[8];
  162.     TempStr: String[8];
  163.  
  164.   Begin
  165.     UnPackTime(DosDate,DT);
  166.     Str(DT.Month:2,TempStr);
  167.     If TempStr[1] = ' ' Then
  168.       OutStr[1] := '0'
  169.     Else
  170.       OutStr[1] := TempStr[1];
  171.     OutStr[2] := TempStr[2];
  172.     OutStr[3] := '-';
  173.     Str(DT.Day:2,TempStr);
  174.     If TempStr[1] = ' ' Then
  175.       OutStr[4] := '0'
  176.     Else
  177.       OutStr[4] := TempStr[1];
  178.     OutStr[5] := TempStr[2];
  179.     OutStr[6] := '-';
  180.     Str(DT.Year:4,TempStr);
  181.     If TempStr[3] = ' ' Then
  182.       OutStr[7] := '0'
  183.     Else
  184.       OutStr[7] := TempStr[3];
  185.     OutStr[8] := TempStr[4];
  186.     OutStr[0] := #8;
  187.     DateStr := OutStr;
  188.   End;
  189.  
  190. Function TimeStr(DosDate: LongInt): String;
  191.   Var
  192. {$IFDEF WINDOWS}
  193.     DT: TDateTime;
  194. {$ELSE}
  195.     DT: DateTime;
  196. {$ENDIF}
  197.     OutStr: String[8];
  198.     TempStr: String[8];
  199.  
  200.   Begin
  201.     UnPackTime(DosDate,DT);
  202.     Str(DT.Hour:2,TempStr);
  203.     If TempStr[1] = ' ' Then
  204.       OutStr[1] := '0'
  205.     Else
  206.       OutStr[1] := TempStr[1];
  207.     OutStr[2] := TempStr[2];
  208.     OutStr[3] := ':';
  209.     Str(DT.Min:2,TempStr);
  210.     If TempStr[1] = ' ' Then
  211.       OutStr[4] := '0'
  212.     Else
  213.       OutStr[4] := TempStr[1];
  214.     OutStr[5] := TempStr[2];
  215.     OutStr[6] := ':';
  216.     Str(DT.Sec:2,TempStr);
  217.     If TempStr[1] = ' ' Then
  218.       OutStr[7] := '0'
  219.     Else
  220.       OutStr[7] := TempStr[1];
  221.     OutStr[8] := TempStr[2];
  222.     OutStr[0] := #8;
  223.     TimeStr := OutStr;
  224.   End;
  225.  
  226.  
  227. Function HexByte(Number: Byte): String;
  228.   Var
  229.     HChar: Char;
  230.     LChar: Char;
  231.  
  232.   Begin
  233.   LChar := Chr((Number And $F) + 48);
  234.   If LChar > '9' Then
  235.     LChar := Chr(Ord(LChar) + 7);
  236.   HChar := Chr((Number shr 4) + 48);
  237.   If HChar > '9' Then
  238.     HChar := Chr(Ord(HChar) + 7);
  239.   HexByte := HChar + LChar;
  240.   End;
  241.  
  242.  
  243. Function HexStr(Number: Word): String;
  244.   Begin
  245.   HexStr := HexByte(Number Shr 8) + HexByte(Number And $FF);
  246.   End;
  247.  
  248.  
  249. Function HexLong(Number: LongInt): String;
  250.   Type
  251.     WordRec = Record
  252.       Lo: Word;
  253.       Hi: Word;
  254.     End;
  255.  
  256.   Begin
  257.   HexLong := HexStr(WordRec(Number).Hi) + HexStr(WordRec(Number).Lo);
  258.   End;
  259.  
  260.  
  261. Function Long2Str(Number: LongInt): String;
  262.   Var
  263.     TempStr: String;
  264.  
  265.   Begin
  266.   Str(Number,TempStr);
  267.   Long2Str := TempStr;
  268.   End;
  269.  
  270.  
  271. Function CommaStr(Number: LongInt): String;
  272.   Var
  273.     StrPos: Integer;
  274.     NumberStr: String;
  275.  
  276.   Begin
  277.   NumberStr := Long2Str(Number);
  278.   StrPos := Length(NumberStr) - 2;
  279.   While StrPos > 1 Do
  280.     Begin
  281.     Insert(',',NumberStr,StrPos);
  282.     StrPos := StrPos - 3;
  283.     End;
  284.   CommaStr := NumberStr;
  285.   End;
  286.  
  287.  
  288.  
  289.  
  290.  
  291. Function wordcount(str : string) : integer;
  292.  
  293.   var
  294.     count : integer;
  295.     i : integer;
  296.     len : integer;
  297.  
  298.   begin
  299.   len := length(str);
  300.   count := 0;
  301.   i := 1;
  302.   while i <= len do
  303.     begin
  304.     while ((i <= len) and ((str[i] = #32) or (str[i] = #9) or (Str[i] = ';'))) do
  305.       inc(i);
  306.     if i <= len then
  307.       inc(count);
  308.     while ((i <= len) and ((str[i] <> #32) and (str[i] <> #9) and (Str[i] <> ';'))) do
  309.       inc(i);
  310.     end;
  311.   wordcount := count;
  312.   end;
  313.  
  314.  
  315. function extractword(str : string; n : integer) : string;
  316.   Var
  317.     count : integer;
  318.     i : integer;
  319.     len : integer;
  320.     done : boolean;
  321.     retstr : string;
  322.  
  323.   Begin
  324.   retstr := '';
  325.   len := length(str);
  326.   count := 0;
  327.   i := 1;
  328.   done := false;
  329.   While (i <= len) and (not done) do
  330.     Begin
  331.     While ((i <= len) and ((str[i] = #32) or (str[i] = #9) or (Str[i] = ';'))) do
  332.       inc(i);
  333.     if i <= len then
  334.       inc(count);
  335.     if count = n then
  336.       begin
  337.       retstr[0] := #0;
  338.       If (i > 1) Then
  339.         If Str[i-1] = ';' Then
  340.           RetStr := ';';
  341.       while ((i <= len) and ((str[i] <> #32) and (str[i] <> #9) and (Str[i] <> ';'))) do
  342.         begin
  343.         inc(retstr[0]);
  344.         retstr[ord(retstr[0])] := str[i];
  345.         inc(i);
  346.         end;
  347.       done := true;
  348.       end
  349.     Else
  350.       while ((i <= len) and ((str[i] <> #32) and (str[i] <> #9) and (Str[i] <> ';'))) do
  351.         inc(i);
  352.     End;
  353.   extractword := retstr;
  354.   End;
  355.  
  356.  
  357. Function WWrap(St:String; Max:Byte):String;
  358.   Var
  359.     TempStr: String;
  360.     TempPos: Byte;
  361.  
  362.   Begin
  363.   ExtraString := '';
  364.   TempStr := St;
  365.   If Length(TempStr) > Max Then
  366.     Begin
  367.     TempPos := Max;
  368.     While ((TempStr[TempPos] <> ' ') And (TempPos > (Max - 20))
  369.       And (TempPos > 1)) Do
  370.       Dec(TempPos);
  371.     If (Length(TempStr) > TempPos) Then
  372.       ExtraString := Copy(TempStr,TempPos + 1,Length(TempStr) - TempPos);
  373.     TempStr[0] := Chr(TempPos);
  374.     End;
  375.   WWrap := TempStr;
  376.   End;
  377.  
  378.  
  379. Function Proper(St:String):String;
  380.   Var
  381.     TempStr: String;
  382.     i: Integer;
  383.     NextUp: Boolean;
  384.  
  385.   Begin
  386.   If Length(St) = 0 Then
  387.     Proper := ''
  388.   Else
  389.     Begin
  390.     i := 1;
  391.     NextUp := True;
  392.     TempStr := St;
  393.     While i <= Length(TempStr) Do
  394.       Begin
  395.       If ((TempStr[i] < 'A') Or (TempStr[i] > 'z')
  396.         Or ((TempStr[i] > 'Z') And (TempStr[i] < 'a')) ) Then
  397.         Begin
  398.         NextUp := True;
  399.         End
  400.       Else
  401.         Begin
  402.         If NextUp = True Then
  403.           Begin
  404.           NextUp := False;
  405.           TempStr[i] := UpCase(TempStr[i]);
  406.           End
  407.         Else
  408.           Begin
  409.           If TempStr[i] < 'a' Then
  410.             TempStr[i] := Char(Ord(TempStr[i]) + 32);
  411.           End;
  412.         End;
  413.       i := i + 1;
  414.       End;
  415.     Proper := TempStr;
  416.     End;
  417.   End;
  418.  
  419.  
  420. Function PadLeft(St:String;Ch:Char;L:Integer): String;
  421.   Var
  422.     TempStr: String;
  423.     i: Word;
  424.  
  425.   Begin
  426.   If Length(St) >= L Then
  427.     PadLeft := Copy(St,1,L)
  428.   Else
  429.     Begin
  430.     For i := 1 to (L - Length(St)) Do
  431.       TempStr[i] := Ch;
  432.     TempStr[0] := Chr(L - Length(St));
  433.     PadLeft := TempStr + St;
  434.     End;
  435.   End;
  436.  
  437.  
  438. Function padright(st:string;ch:char;l:integer):string;
  439.  
  440.   var
  441.     i:          integer;
  442.     tempstr:    string;
  443.  
  444.   begin
  445.   tempstr := st;
  446.   if length(tempstr) > l then
  447.     tempstr[0] := chr(l);
  448.   if length(tempstr) < l then
  449.     begin
  450.     for i := length(tempstr)+1 to l do
  451.       tempstr[i] := ch;
  452.     tempstr[0] := chr(l);
  453.     end;
  454.   padright := tempstr;
  455.   end;
  456.  
  457.  
  458. Function Upper(St:String):String;
  459.   Var
  460.     TempStr: String;
  461.     i: Integer;
  462.  
  463.   Begin
  464.   i := 1;
  465.   TempStr := St;
  466.   While i <= Length(TempStr) Do
  467.     Begin
  468.     TempStr[i] := UpCase(TempStr[i]);
  469.     i := i + 1;
  470.     End;
  471.   Upper := TempStr;
  472.   End;
  473.  
  474.  
  475. Function Lower(St:String):String;
  476.   Var
  477.     TempStr: String;
  478.     i: Integer;
  479.  
  480.   Begin
  481.   i := 1;
  482.   TempStr := St;
  483.   While i <= Length(TempStr) Do
  484.     Begin
  485.     TempStr[i] := LoCase(TempStr[i]);
  486.     i := i + 1;
  487.     End;
  488.   Lower := TempStr;
  489.   End;
  490.  
  491.  
  492. function striplead(st:string;ch:char):string;
  493.   var
  494.     tempstr:        string;
  495.  
  496.   begin
  497.   tempstr := st;
  498.   While ((TempStr[1] = Ch) and (Length(TempStr) > 0)) do
  499.     tempstr := copy (tempstr,2,length(tempstr));
  500.   striplead := tempstr;
  501.   end;
  502.  
  503.  
  504. Function StripTrail(St:String;Ch:Char):String;
  505.   Var
  506.     TempStr: String;
  507.     i: Integer;
  508.  
  509.   Begin
  510.   TempStr := St;
  511.   i := Length(St);
  512.   While ((i > 0) and (St[i] = Ch)) Do
  513.     i := i - 1;
  514.   TempStr[0] := Chr(i);
  515.   StripTrail := TempStr;
  516.   End;
  517.  
  518.  
  519. Function StripBoth(St:String;Ch:Char):String;
  520.  
  521.   Begin
  522.   StripBoth := StripTrail(StripLead(St,Ch),Ch);
  523.   End;
  524.  
  525.  
  526. {$IFDEF WINDOWS}
  527. Function FormattedDate(DT: TDateTime; Mask: String): String;
  528. {$ELSE}
  529. Function FormattedDate(DT: DateTime; Mask: String): String;
  530. {$ENDIF}
  531.   Var
  532.     DStr: String[2];
  533.     MStr: String[2];
  534.     MNStr: String[3];
  535.     YStr: String[4];
  536.     TmpStr: String[15];
  537.     CurrPos: Word;
  538.     i: Word;
  539.  
  540.   Begin
  541.   TmpStr := Mask;
  542.   Mask := Upper(Mask);
  543.   DStr := Copy(PadLeft(Long2Str(Dt.Day),'0',2),1,2);
  544.   MStr := Copy(PadLeft(Long2Str(Dt.Month),'0',2),1,2);
  545.   YStr := Copy(PadLeft(Long2Str(Dt.Year),'0',4),1,4);
  546.   MNStr := MonthStr(Dt.Month);
  547.   If (Pos('YYYY', Mask) = 0) Then
  548.     YStr := Copy(YStr,3,2);
  549.   CurrPos := Pos('DD', Mask);
  550.   If CurrPos > 0 Then
  551.     For i := 1 to Length(DStr) Do
  552.       TmpStr[CurrPos + i - 1] := DStr[i];
  553.   CurrPos := Pos('YY', Mask);
  554.   If CurrPos > 0 Then
  555.     For i := 1 to Length(YStr) Do
  556.       TmpStr[CurrPos + i - 1] := YStr[i];
  557.   CurrPos := Pos('MM', Mask);
  558.   If CurrPos > 0 Then
  559.     For i := 1 to Length(MStr) Do
  560.       TmpStr[CurrPos + i - 1] := MStr[i];
  561.   CurrPos := Pos('NNN', Mask);
  562.   If CurrPos > 0 Then
  563.     For i := 1 to Length(MNStr) Do
  564.       TmpStr[CurrPos + i - 1] := MNStr[i];
  565.   FormattedDate := TmpStr;
  566.   End;
  567.  
  568.  
  569. Function FormattedDosDate(DosDate: LongInt; Mask:String): String;
  570.   Var
  571.     {$IFDEF WINDOWS}
  572.     DT: TDateTime;
  573.     {$ELSE}
  574.     DT: DateTime;
  575.     {$ENDIF}
  576.  
  577.   Begin
  578.   UnPackTime(DosDate, DT);
  579.   FormattedDosDate := FormattedDate(DT, Mask);
  580.   End;
  581.  
  582.  
  583. Function DOWStr(Dow: Word): String;
  584.   Begin
  585.   Case DOW Of
  586.     0: DOWStr := 'Sunday';
  587.     1: DOWStr := 'Monday';
  588.     2: DOWStr := 'Tuesday';
  589.     3: DOWStr := 'Wednesday';
  590.     4: DOWStr := 'Thursday';
  591.     5: DOWStr := 'Friday';
  592.     6: DOWStr := 'Saturday';
  593.     Else
  594.       DOWStr := '?????';
  595.     End;
  596.   End;
  597.  
  598.  
  599. Function DOWShortStr(DOW: Word): String;
  600.   Begin
  601.   DOWShortStr := Copy(DOWStr(Dow),1,3);
  602.   End;
  603.  
  604.  
  605. Function ReformatDate(ODate: String; Mask: String): String;
  606.   Var
  607.     Code: Word;
  608.     {$IFDEF WINDOWS}
  609.     DT: TDateTime;
  610.     {$ELSE}
  611.     DT: DateTime;
  612.     {$ENDIF}
  613.  
  614.   Begin
  615.   Val(Copy(ODate,7,2), DT.Year, Code);
  616.   Val(Copy(ODate,1,2), DT.Month, Code);
  617.   Val(Copy(ODate,4,2), DT.Day, Code);
  618.   If DT.Year < 80 Then
  619.     Inc(DT.Year, 2000)
  620.   Else
  621.     Inc(DT.Year, 1900);
  622.   ReformatDate := FormattedDate(DT, Mask);
  623.   End;
  624.  
  625.  
  626. Function Word2TimeStr(CTime: Word): String;
  627.   Begin
  628.   Word2TimeStr := PadLeft(Long2Str(Hi(CTime)),'0',2) + ':' +
  629.     PadLeft(Long2Str(Lo(CTime)),'0',2);
  630.   End;
  631.  
  632.  
  633. Function TimeStr2Word(TS: String): Word;
  634.   Var
  635.     Vr: Word;
  636.     Vr2: Word;
  637.     Code: Word;
  638.  
  639.   Begin
  640.   Val(Copy(TS,1,2), Vr, Code);
  641.   Val(Copy(TS,4,2), Vr2, Code);
  642.   TimeStr2Word := Vr2 + (Vr shl 8);
  643.   End;
  644.  
  645.  
  646. Function MonthStr(MonthNo: Word): String;
  647.   Begin
  648.   Case MonthNo of
  649.     01: MonthStr := 'Jan';
  650.     02: MonthStr := 'Feb';
  651.     03: MonthStr := 'Mar';
  652.     04: MonthStr := 'Apr';
  653.     05: MonthStr := 'May';
  654.     06: MonthStr := 'Jun';
  655.     07: MonthStr := 'Jul';
  656.     08: MonthStr := 'Aug';
  657.     09: MonthStr := 'Sep';
  658.     10: MonthStr := 'Oct';
  659.     11: MonthStr := 'Nov';
  660.     12: MonthStr := 'Dec';
  661.     Else
  662.       MonthStr := '???';
  663.     End;
  664.   End;
  665.  
  666.  
  667. Function Az2Str(Var Str: String; MaxLen: Byte): String; {Convert asciiz to string}
  668.   Var
  669.     i: Word;
  670.     TmpStr: String;
  671.  
  672.   Begin
  673.   Move(Str, TmpStr[1], MaxLen);
  674.   TmpStr[0] := Chr(MaxLen);
  675.   i := Pos(#0, TmpStr);
  676.   If i > 0 Then
  677.     TmpStr[0] := Chr(i - 1);
  678.   Az2Str := TmpStr;
  679.   End;
  680.  
  681.  
  682. Procedure Str2Az(Str: String; MaxLen: Byte; Var AZStr); {Convert string to asciiz}
  683.   Begin
  684.   If Length(Str) >= MaxLen Then
  685.     Begin
  686.     Str[MaxLen] := #0;
  687.     Move(Str[1], AZStr, MaxLen);
  688.     End
  689.   Else
  690.     Begin
  691.     Str[Length(Str) + 1] := #0;
  692.     Move(Str[1], AZStr, Length(Str) + 1);
  693.     End;
  694.   End;
  695.  
  696.  
  697. Function MKDateToStr(MKD: String): String; {Convert YYMMDD to MM-DD-YY}
  698.   Begin
  699.   MKDateToStr := Copy(MKD,3,2) + '-' + Copy(MKD,5,2) + '-' +
  700.     Copy(MKD,1,2);
  701.   End;
  702.  
  703.  
  704. Function StrToMKDate(Str: String): String; {Convert MM-DD-YY to YYMMDD}
  705.   Begin
  706.   StrToMKDate := Copy(Str,7,2) + Copy(Str,1,2) + Copy(Str,4,2);
  707.   End;
  708.  
  709.  
  710. Function CleanChar(InChar: Char): Char;
  711.   Const
  712.     CtlChars: String[32] = 'oooooooooXoollo><|!Pg*|^v><-^v';
  713.     HiChars: String[64] = 'CueaaaageeeiiiAAEaaooouuyOUcLYPfarounNao?--//!<>***|||||||||||||';
  714.     HiChars2: String[64]= '|--|-+||||=+|=++-=--==-||||*****abcnEduto0nd80En=+><fj/~oo.vn2* ';
  715.  
  716.   Begin
  717.   Case InChar of
  718.     #0..#31: CleanChar := CtlChars[Ord(InChar) + 1];
  719.     #128..#191: CleanChar := HiChars[Ord(InChar) - 127];
  720.     #192..#255: CleanChar := HiChars2[Ord(InChar) - 191];
  721.     Else
  722.       CleanChar := InChar;
  723.     End;
  724.   End;
  725.  
  726.  
  727. Function IsNumeric(Str: String): Boolean;
  728.   Var
  729.     i: Word;
  730.  
  731.   Begin
  732.   IsNumeric := True;
  733.   For i := 1 To Length(Str) Do
  734.     If Not (Str[i] in ['0'..'9']) Then
  735.       IsNumeric := False;
  736.   End;
  737.  
  738.  
  739. End.
  740.